package br.ufrj.neg.bean;

import java.util.ArrayList;
import java.util.HashMap;

public abstract class TraducaoBean {

	private HashMap<String, HashMap<Idioma, String> > dict;
	private Idioma idioma;	
	private int id;
	
	public TraducaoBean(Idioma idioma){
		this.idioma = idioma;
		this.dict = new HashMap<String, HashMap<Idioma,String>>();		
		for (String nomeCampo : getNomeCampos()) {
			HashMap<Idioma, String> dictCampo = new HashMap<Idioma, String>();
			dict.put(nomeCampo, dictCampo);
		}		
	}
	
	/*Retorna uma lista de nomes unicos pelos quais se dara o acesso de cada um dos campos traduziveis pelo dicionario*/
	public abstract ArrayList<String> getNomeCampos();
	
	/*Retorna uma lista de labels para exibicao na janela de edicao de traducao para cada um dos campos. A ordem deve 
	 * ser a mesma da de getNomeCampos(). Os valores aqui postos devem ser a chave da representacao do mesmo no arquivo
	 * de properties. Ex: "negociacao.dicas.descricao" para o campo Descricao do bean DicaNegociacaoBean
	 */
	public abstract ArrayList<String> getLabelCampos();	
	
	/**
	 * Seta o id do elemento
	 * @param id
	 */
	public void setId(int id) {
		this.id = id;
	}
	
	/**
	 * @return id do elemento, na sua tabela original
	 */
	public int getId() {
		return this.id;
	}
	
	/**
	 * id da tabela, na tabela tabela_idiomada
	 * Ver o id na classe TraducaoConstantes
	 * @return
	 */
	public abstract int getIdTabela();
		
	/**
	 * @return Uma instancia do bean que extende a interface TraducaoBean
	 */
	public abstract TraducaoBean getNewInstance();
	
	/**
	 * Retorna o idioma corrente da traducao atual
	 * @return idioma
	 */
	public Idioma getIdioma() {
		return idioma;
	}	
	
	/**
	 * @return O conjunto de dicionarios. Um dicionario para cada campo idiomado.
	 */
	public HashMap<String, HashMap<Idioma, String> > getDicionario(){
		return dict;
	}	
	
	/**
	 * @param dict Dicionario com as respectivas traducoes dos campos para este bean.
	 */
	public void setDicionario( HashMap<String, HashMap<Idioma, String> > dict){
		this.dict = dict;
	}		
	
	/**
	 * @param idioma
	 * @param nomeCampo
	 * @param texto
	 */
	public void setTraducao(Idioma idioma, String nomeCampo, String texto ){		
		dict.get(nomeCampo).put(idioma, texto);
	}
	
	/**
	 * @param dict
	 * Atualiza o dicionario da instancia atual com base em outro dicionario.
	 * 
	*/ 
	public void addAllDicionario(HashMap<String, HashMap<Idioma, String>> dict){
		for( String key:dict.keySet() ){
			if( !this.dict.containsKey(key) ){
				this.dict.put(key, dict.get(key));
			}
			else{
				this.dict.get(key).putAll(dict.get(key));
			}
			
		}
	}
	
	
	/**
	 * Serve apenas para instanciar um novo dicionario para o campo, caso ainda nao exista uma entrada referente no HashMap.
	 * @param nomeCampo
	 * @return O dicionario especifico para o campo
	 */
	/*
	public HashMap<Idioma, String> getDicionarioCampo(String nomeCampo){	
		HashMap<Idioma, String> dictCampo;		
		if( dict.containsKey(nomeCampo) ){
			dictCampo = dict.get(nomeCampo); 
		}
		else{
			dictCampo = new HashMap<Idioma, String>();			
			dict.put(nomeCampo, dictCampo);
		}		
		return dictCampo;		
	}
	*/
}
